# 抽象类


'''
下面的 Payment，并不是一个抽象类，因为子类可以不实现 pay 方法。

class Payment(object):
    #规定了一个兼容接口
    def pay(self):
        pass

class WeChatPay(object):
    def pay1(self,money):
        print('微信支付了%s'%money)

we = WeChatPay()
we.pay1(11)
'''

'''
抽象类
需要借助 abc 内置模块实现。
dir(abc)
['ABC', 'ABCMeta', 'WeakSet', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'abstractclassmethod', 'abstractmethod', 'abstractproperty', 'abstractstaticmethod', 'get_cache_token']
'''
import abc
# 不能只继承 object 类了，关键字参数 metaclass=abc.ABCMeta 是必须的，否则就不是一个抽象类了。
class Animal(metaclass=abc.ABCMeta):
    # 抽象方法
    @abc.abstractmethod
    def run(self):
        pass

#class Dog(Animal):
    #pass
    #def eat(self):
        #print('狗吃肉')

class Cat(Animal):
    # 在Animal 继承了 metaclass=abc.ABCMeta 后，Cat 类就必须实现 run 方法了。
    
    def eat(self):
        print('猫吃鱼')

cat = Cat()
cat.eat()
cat.run()

#dog = Dog()
#dog.eat()
#dog.run()
